package Modelo;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the cliente database table.
 * 
 */
@Entity(name="cliente")
@NamedQueries({ 
	@NamedQuery(name="Cliente.findAll", query="  SELECT c FROM cliente c"),
	@NamedQuery(name="Cliente.findByNif", query="SELECT c FROM cliente c WHERE c.nif=:nif "),
})
public class Cliente implements Serializable, ICliente {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name="CLIENTE_IDCLIENTE_GENERATOR", sequenceName="BD")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CLIENTE_IDCLIENTE_GENERATOR")
	@Column(name="id_cliente", unique=true, nullable=false)
	private int idCliente;
	
	@Column(name="nombre", nullable=false, length=250)
	private String nombre;

	@Column(name="apellidos", nullable=false, length=250)
	private String apellidos;
	
	@Column(name="nif", nullable=false, length=9)
	private String nif;
	
	@Column(name="telefono", nullable=false, length=9)
	private String telefono;
	
	@Column(name="email", nullable=false, length=250)
	private String email;

	@Column(name="direccion", nullable=false, length=250)
	private String direccion;
	
	@Column(name="municipio", nullable=false, length=250)
	private String municipio;

	@Column(name="provincia", nullable=false, length=250)
	private String provincia;

	@Column(name="cp", nullable=false, length=5)
	private String cp;


	//Constructor
    public Cliente (){}
    
    public Cliente(String nombre, String apellidos, String nif,
			String telefono, String email, String direccion, String municipio,
			String provincia, String cp) throws Exception {
    	setNombre(nombre);
    	setApellidos(apellidos);
    	setNif(nif);
    	setTelefono(telefono);
    	setEmail(email);
    	setDireccion(direccion);
    	setMunicipio(municipio);
    	setProvincia(provincia);
    	setCP(cp);
	}
    
    //Getter and Setter
	public int getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}

	public String getNombre() {
		return this.nombre;
	}

	public void setNombre(String nombre) throws Exception {
		if(nombre==null || nombre.length() < 1 || nombre.length()>75)
			throw new Exception("El nombre debe tener entre 1 y 75 caracteres.");
		else
			this.nombre=nombre;
	}

	public String getApellidos() {
		return this.apellidos;
	}

	public void setApellidos(String apellidos) throws Exception {
		if(apellidos==null || apellidos.length() < 1 || apellidos.length()>150)
			throw new Exception("Los apellidos debe tener entre 1 y 150 caracteres.");
		else
			this.apellidos=apellidos;
	}

	public String getNif() {
		return this.nif;
	}

	public void setNif(String nif) throws Exception {
		if(nif.toUpperCase().matches("^[0-9]{8}[a-zA-Z]{1}$")){
	         if(nif.toUpperCase().charAt(8)==(this.calcularLetraNif(Integer.parseInt(nif.substring(0,8)))))
	            this.nif=nif.toUpperCase();
	         else
	            throw new Exception("Letra del DNI Incorrecta.");
	      }
	      else
	         throw new Exception("El formato del DNI es incorrecto.");
	}

	public String getTelefono() {
		return this.telefono;
	}

	public void setTelefono(String telefono)  throws Exception{
		if(telefono!=null && telefono.length()!=9)
			throw new Exception("El tlf. debe tener una longitud de 9 caracteres máximo.");
		else
			this.telefono=telefono;
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) throws Exception {
		if(email.matches("^.+@.+\\..+$"))
			this.email=email;
	    else
	    	throw new Exception("El formato del email es incorrecto.");
	}

	public String getDireccion() {
		return this.direccion;
	}

	public void setDireccion(String direccion) throws Exception {
		if(direccion==null || direccion.length() < 1 || direccion.length()>250)
			throw new Exception("La direccion debe tener entre 1 y 250 caracteres.");
		else
			this.direccion=direccion;
	}

	public String getMunicipio() {
		return this.municipio;
	}

	public void setMunicipio(String municipio) throws Exception {
		if(municipio==null || municipio.length() < 1 || municipio.length()>150)
			throw new Exception("El municipio debe tener entre 1 y 150 caracteres.");
		else
			this.municipio=municipio;
	}

	public String getProvincia() {
		return this.provincia;
	}

	public void setProvincia(String provincia) throws Exception {
		if(provincia==null || provincia.length() < 1 || provincia.length()>150)
			throw new Exception("La provincia debe tener entre 1 y 150 caracteres.");
		else
			this.provincia=provincia;
	}

	public String getCP() {
		return this.cp;
	}

	public void setCP(String cp) throws Exception {
		if(cp!=null && cp.length()!=5)
			throw new Exception("El CP. debe tener una longitud de 5 digitos.");
		else
			this.cp=cp;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	private char calcularLetraNif(int nif){
		String juegoCaracteres="TRWAGMYFPDXBNJZSQVHLCKET";
	    int modulo= nif % 23;
	    char letra = juegoCaracteres.charAt(modulo);
	    return letra;
	}

}